{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 206 Optimizers\n",
    "\n",
    "View more, visit my tutorial page: https://morvanzhou.github.io/tutorials/\n",
    "My Youtube Channel: https://www.youtube.com/user/MorvanZhou\n",
    "\n",
    "Dependencies:\n",
    "* torch: 0.4\n",
    "* matplotlib\n",
    "\n",
    "https://ptorch.com/docs/4/pytorch-video-optimizer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "import torch.utils.data as Data\n",
    "import torch.nn.functional as F\n",
    "from torch.autograd import Variable\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<torch._C.Generator at 0x17a468e0db0>"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "torch.manual_seed(1)    # reproducible"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "LR = 0.01\n",
    "BATCH_SIZE = 32\n",
    "EPOCH = 12"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Generate some fake data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# fake dataset\n",
    "x = torch.unsqueeze(torch.linspace(-1, 1, 1000), dim=1)\n",
    "y = x.pow(2) + 0.1*torch.normal(torch.zeros(*x.size()))\n",
    "\n",
    "# plot dataset\n",
    "plt.scatter(x.numpy(), y.numpy())\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Put dataset into torch dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "torch_dataset = Data.TensorDataset(x, y)\n",
    "\n",
    "loader = Data.DataLoader(\n",
    "    dataset=torch_dataset,\n",
    "    batch_size=BATCH_SIZE,\n",
    "    shuffle=True, num_workers=2,)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Default network"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Net(torch.nn.Module):\n",
    "    def __init__(self):\n",
    "        super(Net, self).__init__()\n",
    "        self.hidden = torch.nn.Linear(1, 20)   # hidden layer\n",
    "        self.predict = torch.nn.Linear(20, 1)   # output layer\n",
    "\n",
    "    def forward(self, x):\n",
    "        x = F.relu(self.hidden(x))      # activation function for hidden layer\n",
    "        x = self.predict(x)             # linear output\n",
    "        return x"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Different nets"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "net_SGD         = Net()\n",
    "net_Momentum    = Net()\n",
    "net_RMSprop     = Net()\n",
    "net_Adam        = Net()\n",
    "nets = [net_SGD, net_Momentum, net_RMSprop, net_Adam]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Different optimizers\n",
    "\n",
    "可以将SGD看成momentum=0的Momentum。\n",
    "\n",
    "adam容易爆显存，要用的话大网络建议减小batch。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "opt_SGD         = torch.optim.SGD(net_SGD.parameters(), lr=LR)\n",
    "opt_Momentum    = torch.optim.SGD(net_Momentum.parameters(), lr=LR, momentum=0.8)\n",
    "opt_RMSprop     = torch.optim.RMSprop(net_RMSprop.parameters(), lr=LR, alpha=0.9)\n",
    "opt_Adam        = torch.optim.Adam(net_Adam.parameters(), lr=LR, betas=(0.9, 0.99))\n",
    "optimizers = [opt_SGD, opt_Momentum, opt_RMSprop, opt_Adam]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "loss_func = torch.nn.MSELoss()\n",
    "losses_his = [[], [], [], []]   # record loss"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch:  0\n",
      "Epoch:  1\n",
      "Epoch:  2\n",
      "Epoch:  3\n",
      "Epoch:  4\n",
      "Epoch:  5\n",
      "Epoch:  6\n",
      "Epoch:  7\n",
      "Epoch:  8\n",
      "Epoch:  9\n",
      "Epoch:  10\n",
      "Epoch:  11\n"
     ]
    },
    {
     "data": {
      "image/png": "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IpJUhKeDefvttzFkyBAMGjQInTp1wiOPPAJA04K6dOmCO+64A6eddhq2b9+OKVOmIDc3F927d8cDDzxgHKtOnTq4//77cdppp+GCCy7Avn37Unrt8ZDSlC7HPcJiEf5SNH9xjeW5bzbg7gs7VMqQqjqljEJR2Ty55En8duC3pB6zc8POeKDvA9EbQss8/O233+KWW24xbR8+fDimTp2Kk08+GX6/H82aNcPOnVoC93vvvRfnn38+zjzzTAwcOBCjR49G/fr1AQBLlizBmjVrUKtWLfTp0weDBw9G48aNsX79erz11lt4+eWXsXPnTjzwwANYvnw5GjRogIEDB2L69OkYOnQojh07htNOOw3PPPMMJk6ciEceecRIpV9dUBqLGxJTWEUooqIGQ5Wvriq5olBUDiUlJcjLy0OjRo1w4MABI8U9Z9CgQZgzZw6mTJmCa6+91rRv9OjRWLduHa6++mrMnz8f/fr1Q1lZGQDgoosuQqNGjZCVlYUrr7wSCxcuBACccsop6NevHwBg6dKlGDBgAHJychAIBHDddddhwQItlZTP5zPOd/311xv9qxNKY3FDYgq7e+pKY1tZsAoEi/KyKGoYXjWLZMN9LEVFRbjsssvw0ksv4a677jL2p6eno1evXnjmmWewdu1afP7556b+zZo1w80334ybb74Z3bt3x5o1WoUPsqTN4O9r165tbIsl+tN6vOqA0ljc8PmNl7KPzkmwvLFwKz77JdaaZt5QGotCUbnUq1cPL7zwAp5++mmjrDDn/vvvx5NPPolGjRqZtn/11VdG2927d6OwsBDNm2vJ2ufMmYMDBw6gpKQE06dPx1lnnWU75+mnn47vvvsO+/fvRygUwpQpU3DuuecCAMLhMD766CMAwPvvv4+zzz476decKEpjcUMSbixS7iBYHv3iVwDA5ac2S8mwFApF5dKzZ0+ceuqpmDp1Ks455xxje7du3aSp7r/++mvcfffdyMzMBAD885//xMknnwwAOPvss3HDDTdg06ZNGDlyJHr37m2r6ti0aVP84x//wHnnnQfGGC699FIMGTIEgKbZrF27Fr169UK9evUwbdq0FF11/CjB4kY0wVIFPhblvFcoKoejR4+a3oumLm7WErnppptw0003AQCeffZZPPvss9LjNmnSxOZsb926te2YI0eOxMiR8qK7jz76KB599NGo11BV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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# training\n",
    "for epoch in range(EPOCH):\n",
    "    print('Epoch: ', epoch)\n",
    "    for step, (batch_x, batch_y) in enumerate(loader):          # for each training step\n",
    "#         batch_x = Variable(batch_x)\n",
    "#         batch_y = Variable(batch_y)\n",
    "\n",
    "        for net, opt, l_his in zip(nets, optimizers, losses_his):\n",
    "            output = net(batch_x)              # get output for every net\n",
    "            loss = loss_func(output, batch_y)  # compute loss for every net\n",
    "            opt.zero_grad()                # clear gradients for next train\n",
    "            loss.backward()                # backpropagation, compute gradients\n",
    "            opt.step()                     # apply gradients\n",
    "            l_his.append(loss.item())      # loss recoder\n",
    "\n",
    "labels = ['SGD', 'Momentum', 'RMSprop', 'Adam']\n",
    "for i, l_his in enumerate(losses_his):\n",
    "    plt.plot(l_his, label=labels[i])\n",
    "plt.legend(loc='best')\n",
    "plt.xlabel('Steps')\n",
    "plt.ylabel('Loss')\n",
    "plt.ylim((0, 0.2))\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
